#版本更新1：实现循环判断，思路先加一个死循环while1，可以实现不断输入，再加一个if。选中代码 统一进行缩进
#版本更新2：输入错误给与提示该如何输入，且实现对格式的控制
#版本更新3：对未包含的所有其他字符予以通过
#版本更新4(重构1)：对代码进行重构，使之变为pythonic (更多的使用python库中的函数),让它更精致，使用string库
#版本更新5(重构2)：去掉一些注释，去掉常量定义,直接使用string库中的函数
#版本更新6(重构3)： 使用二进制 置位 按位与 按位或
#版本更新7(重构4)：删除注释
#版本更新8(封装)：代码函数化，折叠复杂度
import string

#因为函数要先定义后使用，所以把函数设计放在后面了，请先看后面的主体部分！！！

def yanzheng_password(user_password): #定义函数
    result = False                    #完善函数：设置一个变量，最开始是False

    password_state = 0b00000    #下边有5个条件，所以设置5个0.

    #遍历各个条件
    for char in user_password:
        if char in string.ascii_uppercase:
            password_state = password_state | 0b10000     #表明第一个条件成立
            #have_upper = True
        elif char in string.ascii_lowercase:
            password_state |= 0b01000  # 表明第二个条件成立     #可以简写成 |=
            have_lower = True
        elif char in string.digits:
            password_state |= 0b00100  # 表明第三个条件成立
            have_digit = True
        else:
            password_state |= 0b00010  # 表明第四个条件成立
            have_punctuation = True     #都不满足，则为其它字符
    if len(user_password) >= 8:            #这是一个判断语句，结果输出是 True or False
        password_state |= 0b00001  # 表明第五个条件成立

    #todo:输出反馈：

    if password_state == 0b11111:
        print('密码符合要求！')
        #break
        #完善函数：如果密码符合条件，则result=True
        result = True
    else:
        tishi = '密码不符合要求，'
        if password_state & 0b00001 == 0:     #( 取 password_state 的最后一位 看看是不是等于 0b00001)
            tishi = tishi + '长度不足8，'
        if password_state & 0b10000 == 0:
            tishi = tishi + '没有包含大写字符，'
        if password_state & 0b01000 == 0:
            tishi += '没有包含小写字符，'     # += 的快捷方式 -= 的快捷方式
        if password_state & 0b00100 == 0:
            tishi += '没有包含数字，'
        if password_state & 0b00010 == 0:
            tishi += '没有包含标点,'

        tishi = tishi[:-1]       #去掉最后的逗号

        print(tishi)

    #完善函数：密码不符合要求，进行修改，修改之后再进行判断
            #符合要求了，返回函数的值 result
    return (result)

#因为函数要先定义后使用，所以把函数设计放在后面了，请先看后面的主体部分！！！

while 1:

    #TODO:用户输入密码
    user_password = input('请输入密码:')

    #TODO：判断密码的合法性(只是判断)
    ##为了让程序显得更加简洁，故而引用函数设计，将下边的所有代码设计成函数进行使用，让使用者更加清晰的使用你的程序
    if yanzheng_password(user_password):      #设计函数用法：验证密码，如果没有问题，则停止，如果有问题，则继续循环，更改条件。
        break

#你看这样，这个程序就很简单，只有四行主体部分。这个过程就是  ！！！封装！！！
    #同时，值得注意的是，第三行，将庞杂的代码变为函数，这个过程 学名叫 折叠复杂度 意思就是，将庞杂的代码用一行代码来代替了。
###还有一个极为重要的作用：代码的重用，若是之后还要使用被动验证密码这个功能，就可以直接引用这个已经写好的函数就可以了。
###作为架构师：要构建自己的函数库，即作为工具库。

# _*_coding:utf-8_*_
